#ifndef TP5REGION_INC
#define TP5REGION_INC


#include "Point.h"
#include <vector>

using std::vector;

namespace Torch{

class Region
{
public:
	
	Region *m_fils1,*m_fils2,*m_fils3,*m_fils4;
	
	//caracteristiques des regions
	//m_iX1 est l'abscice du point superieur a guache de la region
	//m_iY1 est l'ordonnee du pint superieur a guache de la region
	//m_iX2	est l'abscice du point inferieur a droite de la region
	//m_iY2 est l'ordonnee du point inferieur a droite de la region
	//m_iMu est la moyenne des pixels dans la region 
	//m_iSigma est la variance 
	//m_iminMax est la 
	int m_iX1,m_iY1,m_iX2,m_iY2,m_iMu,m_iSigma,m_iNbPixel;	
	int m_iLabel;
	Point p1,p2;
	
	
	//Ce vecteur permet de conserver les etiquettes des regions qui l'entourent
	vector<int> m_Voisin;
		
	//constructeur 
	Region();
	
	Region* filsS1(){return this->m_fils1; }
	Region* filsS2(){return this->m_fils2; }
	Region* filsS3(){return this->m_fils3; }
	Region* filsS4(){return this->m_fils4; }

	void addFilsS1(){ this->m_fils1 = new Region();}
	void addFilsS2(){ this->m_fils2 = new Region();}
	void addFilsS3(){ this->m_fils3 = new Region();}
	void addFilsS4(){ this->m_fils4 = new Region();}
	

	//label est l'identifiant de la region
	void setLabel(int label){this->m_iLabel=label;}
	
	//cette methode defini l'ensemble des voisins d'une region
	void setVoisin(vector< int > voisin);			
	void setVoisin(int i,int val){m_Voisin[i]=val;}
	
	//fixe les extremites de la diagonale principale 
	void setCoordonne(int ix1,int iy1 ,int ix2,int iy2);
	
	void setParameter(int iMu,int iSigma,int iNbPixel);

	
	//renvoie les extremite de la diagonale principale
	void getCoord(int *ix1,int *iy1,int *ix2,int *iy2);
	void getCoord(Point *p1,Point *p2);
	void getParameters(int *iMu,int *iSigma,int *iNbPixel);
	
	//retourne le nombre de voisin a la region 
	int getNbVoisin(){return this->m_Voisin.size();}

	int getLabel(){return this->m_iLabel;}
	
	vector<int> getVoisin(){return this->m_Voisin;}
	
	//renvoie le voisin en position i	
	int getVoisin(int i){return this->m_Voisin[i];}

	//supprime le voisin i de la liste ; un voisin est en effet identifier par son identificateur
	void supVoisin(int i){m_Voisin.erase(m_Voisin.begin()+i);}
	
	//ajoute un voisin a la liste ; un voisin est en effet identifier par son identificateur
	void addVoisin(int iVal){this->m_Voisin.push_back(iVal);}
	//void getCoord(Point *p1,Point *p2);	
	
	//Teste si une region est une feuille ou non retourne true en cas de success, 
	//autrement, retourne false
	bool isLeaf(){return (this->m_fils1==0 && this->m_fils2==0 && this->m_fils3==0 && this->m_fils4==0);}
	
};

}

#endif /* IMAGETP5REGION_H_ */
